package com.netty.common.commonhandler;

import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleStateEvent;
import io.netty.handler.timeout.IdleStateHandler;

import java.util.concurrent.TimeUnit;

/**
 *
 * 空闲检测和定时心跳
 * 在服务端和客户端的通信过程中，有时候会出现假死连接，或者长时间没有消息传递需要释放连接。
 * 对于这些连接，我们需要及时释放，毕竟每条连接都占用着CPU和内存资源。大量这种连接如果不及时释放，服务器资源迟早会耗尽，最终崩溃。
 * 应对这种问题的解决方式是：Netty提供了IdleStateHandler做空闲检测，用来检测连接是否活跃，如果再指定的时间内，没有活跃，那么就关闭连接。
 * 然后就是客户端定时发送心跳请求，服务器响应心跳请求。

 * IM聊天空闲检测器
 * 比如：20秒内没有数据，则关闭通道
 */
public class ImIdleStateHandler extends IdleStateHandler {

    /**
     * 读取数据空闲时间，单位：秒
     */
    private static final int READER_IDLE_TIME = 20;

    public ImIdleStateHandler() {
        super(READER_IDLE_TIME, 0, 0, TimeUnit.SECONDS);
    }

    @Override
    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) {
        System.out.println(READER_IDLE_TIME + "秒内未读到数据，关闭连接！");
        ctx.channel().close();
    }
}
